#!/bin/bash

# JDFS2 系统集成测试脚本
# 用于运行完整的系统集成测试

set -e  # 遇到错误立即退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 脚本目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TOOLS_DIR="$SCRIPT_DIR/tools"

# 默认配置
DEFAULT_HOST="http://localhost:8000"
DEFAULT_ACCESS_KEY="AKIAIOSFODNN7EXAMPLE"
DEFAULT_SECRET_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"

# 显示帮助信息
show_help() {
    echo -e "${BLUE}JDFS2 系统集成测试脚本${NC}"
    echo
    echo -e "${YELLOW}用法:${NC}"
    echo "  $0 [选项]"
    echo
    echo -e "${YELLOW}选项:${NC}"
    echo "  -h, --host HOST         S3 服务端点 (默认: $DEFAULT_HOST)"
    echo "  -a, --access-key KEY    AWS Access Key (默认: 教学用凭据)"
    echo "  -s, --secret-key KEY    AWS Secret Key (默认: 教学用凭据)"
    echo "  -c, --cleanup-only      仅清理测试数据"
    echo "  -v, --verbose           详细输出"
    echo "  --help                  显示此帮助信息"
    echo
    echo -e "${YELLOW}示例:${NC}"
    echo "  $0                                    # 运行完整测试"
    echo "  $0 --host http://your-server:8000    # 指定服务器地址"
    echo "  $0 --cleanup-only                    # 仅清理测试数据"
    echo "  $0 --verbose                         # 详细输出"
    echo
    echo -e "${YELLOW}测试流程:${NC}"
    echo "  1. 服务器连接测试"
    echo "  2. Bucket 管理测试"
    echo "  3. 对象操作测试"
    echo "  4. 多部分上传测试"
    echo "  5. 高级功能测试"
    echo "  6. 错误处理测试"
    echo "  7. 清理测试数据"
}

# 检查依赖
check_dependencies() {
    echo -e "${BLUE}🔍 检查依赖...${NC}"
    
    # 检查Python3
    if ! command -v python3 &> /dev/null; then
        echo -e "${RED}❌ 错误: 未找到 python3${NC}"
        echo "请安装 Python 3.6 或更高版本"
        exit 1
    fi
    
    # 检查Python版本
    python_version=$(python3 -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')")
    major_version=$(echo "$python_version" | cut -d. -f1)
    minor_version=$(echo "$python_version" | cut -d. -f2)
    
    if [[ $major_version -lt 3 ]] || [[ $major_version -eq 3 && $minor_version -lt 6 ]]; then
        echo -e "${RED}❌ 错误: Python 版本过低 ($python_version)${NC}"
        echo "需要 Python 3.6 或更高版本"
        exit 1
    fi
    
    echo -e "${GREEN}✅ Python 版本: $python_version${NC}"
    
    # 检查sys_test.py文件
    if [[ ! -f "$TOOLS_DIR/sys_test.py" ]]; then
        echo -e "${RED}❌ 错误: 未找到 $TOOLS_DIR/sys_test.py${NC}"
        exit 1
    fi
    
    echo -e "${GREEN}✅ 找到测试脚本: $TOOLS_DIR/sys_test.py${NC}"
    
    # 检查boto3库
    if ! python3 -c "import boto3" &> /dev/null; then
        echo -e "${YELLOW}⚠️  警告: 未找到 boto3 库${NC}"
        echo "正在尝试安装 boto3..."
        pip3 install boto3
        if [[ $? -eq 0 ]]; then
            echo -e "${GREEN}✅ boto3 安装成功${NC}"
        else
            echo -e "${RED}❌ 错误: boto3 安装失败${NC}"
            echo "请手动安装: pip3 install boto3"
            exit 1
        fi
    else
        echo -e "${GREEN}✅ boto3 库已安装${NC}"
    fi
}

# 检查服务器连接
check_server_connection() {
    local host="$1"
    echo -e "${BLUE}🔍 检查服务器连接...${NC}"
    
    # 提取主机名和端口
    if [[ $host =~ ^https?://([^:]+):([0-9]+)$ ]]; then
        hostname="${BASH_REMATCH[1]}"
        port="${BASH_REMATCH[2]}"
    elif [[ $host =~ ^https?://([^:]+)$ ]]; then
        hostname="${BASH_REMATCH[1]}"
        port="80"
    else
        echo -e "${RED}❌ 错误: 无效的主机地址格式: $host${NC}"
        exit 1
    fi
    
    # 检查网络连接
    if command -v nc &> /dev/null; then
        if nc -z "$hostname" "$port" 2>/dev/null; then
            echo -e "${GREEN}✅ 服务器连接正常: $host${NC}"
        else
            echo -e "${YELLOW}⚠️  警告: 无法连接到服务器 $host${NC}"
            echo "请确保 JDFS2 服务器正在运行"
            read -p "是否继续测试? (y/N): " -n 1 -r
            echo
            if [[ ! $REPLY =~ ^[Yy]$ ]]; then
                exit 1
            fi
        fi
    else
        echo -e "${YELLOW}⚠️  警告: 无法检查网络连接 (nc 命令不可用)${NC}"
    fi
}

# 运行测试
run_test() {
    local host="$1"
    local access_key="$2"
    local secret_key="$3"
    local cleanup_only="$4"
    local verbose="$5"
    
    echo -e "${BLUE}🚀 开始系统集成测试${NC}"
    echo -e "${BLUE}================================${NC}"
    echo -e "📦 服务器: $host"
    echo -e "🔑 Access Key: $access_key"
    echo -e "🔐 Secret Key: $secret_key"
    echo -e "🧹 仅清理: $cleanup_only"
    echo -e "📝 详细输出: $verbose"
    echo -e "${BLUE}================================${NC}"
    echo
    
    # 构建命令
    local cmd="python3 $TOOLS_DIR/sys_test.py"
    cmd="$cmd --host $host"
    cmd="$cmd --access-key $access_key"
    cmd="$cmd --secret-key $secret_key"
    
    if [[ "$cleanup_only" == "true" ]]; then
        cmd="$cmd --cleanup-only"
    fi
    
    if [[ "$verbose" == "true" ]]; then
        cmd="$cmd --verbose"
    fi
    
    echo -e "${YELLOW}执行命令: $cmd${NC}"
    echo
    
    # 执行测试
    eval "$cmd"
    local exit_code=$?
    
    echo
    if [[ $exit_code -eq 0 ]]; then
        echo -e "${GREEN}🎉 测试完成！${NC}"
    else
        echo -e "${RED}❌ 测试失败！退出码: $exit_code${NC}"
    fi
    
    return $exit_code
}

# 主函数
main() {
    # 默认参数
    local host="$DEFAULT_HOST"
    local access_key="$DEFAULT_ACCESS_KEY"
    local secret_key="$DEFAULT_SECRET_KEY"
    local cleanup_only="false"
    local verbose="false"
    
    # 解析命令行参数
    while [[ $# -gt 0 ]]; do
        case $1 in
            -h|--host)
                host="$2"
                shift 2
                ;;
            -a|--access-key)
                access_key="$2"
                shift 2
                ;;
            -s|--secret-key)
                secret_key="$2"
                shift 2
                ;;
            -c|--cleanup-only)
                cleanup_only="true"
                shift
                ;;
            -v|--verbose)
                verbose="true"
                shift
                ;;
            --help)
                show_help
                exit 0
                ;;
            *)
                echo -e "${RED}❌ 错误: 未知参数 $1${NC}"
                echo "使用 --help 查看帮助信息"
                exit 1
                ;;
        esac
    done
    
    # 显示欢迎信息
    echo -e "${BLUE}🚀 JDFS2 系统集成测试${NC}"
    echo -e "${BLUE}========================${NC}"
    echo
    
    # 检查依赖
    check_dependencies
    
    # 检查服务器连接
    check_server_connection "$host"
    
    echo
    
    # 运行测试
    run_test "$host" "$access_key" "$secret_key" "$cleanup_only" "$verbose"
}

# 捕获中断信号
trap 'echo -e "\n${YELLOW}⚠️  测试被用户中断${NC}"; exit 130' INT

# 运行主函数
main "$@"
